home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / smaltalk / manchest.lha / MANCHESTER / manchester / 4.1 / Browser-spellingCheck.st < prev    next >
Text File  |  1993-07-24  |  6KB  |  148 lines

  1. "    NAME        Browser-spellingCheck
  2.     AUTHOR        Bernard Horan <bernard@is.morgan.com>
  3.     CONTRIBUTOR    Bernard Horan <bernard@is.morgan.com>
  4.     FUNCTION      adds spelling correction to some browser menus
  5.     ST-VERSIONS    4.1
  6.     PREREQUISITES     
  7.     CONFLICTS     
  8.     DISTRIBUTION    world
  9.     VERSION        1.0
  10.     DATE        December 1992
  11.     SUMMARY        Adds the following three spelling corrections to the
  12. browser: findClass (if no class exists for the entered string then try and find
  13. one that does -- this also checks with the user that the edited text may be
  14. discarded before requesting for the class name); implementors (if no 
  15. implementor exists with the name provided, then try and find one that does); 
  16. senders (similar to implementors). BH 4/12/92"
  17.  
  18. 'From Objectworks\Smalltalk(R), Release 4.1 of 15 April 1992 on 27 November 1992 at 2:39:55 am'!
  19.  
  20.  
  21.  
  22. !Browser methodsFor: 'private-category functions'!
  23.  
  24. findClass
  25.     "Prompt for a class and position myself there."
  26.     "Modified by Bernard Horan, 27 November 1992, to 
  27.     send #changeRequest BEFORE asking user for class name"
  28.  
  29.     | testClass |
  30.     self changeRequest ifFalse: [^self].
  31.     testClass := self pickAClass: 'Find class:'.
  32.     testClass = '' ifTrue: [^self].
  33.     testClass == nil ifTrue: [^DialogView warn: 'No matching class'].
  34.     testClass isBehavior ifFalse: [testClass := testClass class].
  35.     testClass isMeta ifTrue: [testClass := testClass soleInstance].
  36.     self newCategoryList: testClass category.
  37.     self newClassList: testClass name!
  38.  
  39. pickAClass: prompt    
  40.     "Choose a class with a prompter.  Bring up menu for wildcards.
  41.     Answer the an empty string if that's what the user returned or
  42.     if the user selects outside the menu, answer nil if the user picks
  43.     a name that does not match any class name."
  44.  
  45.     | destClassName destClass classes chosenSelector |
  46.     destClassName := DialogView request: prompt initialAnswer: ParagraphEditor currentSelection. 
  47.     destClassName = '' ifTrue: [^''].
  48.     (destClassName findString: '*' startingAt: 1) ~=0
  49.         ifTrue: [classes := OrderedCollection new.
  50.                 Cursor execute showWhile:
  51.                     [classes := Smalltalk classNames select: [ :cn | destClassName match: cn]].
  52.                 (classes == nil or: [classes size = 0]) ifTrue: [^nil].
  53.                 (chosenSelector := (PopUpMenu labelList: (Array with: classes)) startUp) = 0
  54.                         ifTrue: [^'']
  55.                         ifFalse: [destClassName := classes at: chosenSelector]]
  56.         ifFalse: [destClassName := 
  57.                     Smalltalk keys 
  58.                         detect: [ :cn | destClassName match: cn] 
  59.                         ifNone: [self correctClass: destClassName].
  60.                 destClassName isNil ifTrue:[^nil]].
  61.     destClass := Smalltalk at: destClassName asSymbol ifAbsent: [^nil].
  62.     meta ifTrue: [destClass := destClass class].
  63.     ^destClass! !
  64.  
  65. !Browser methodsFor: 'private'!
  66.  
  67. correctClass: aString 
  68.     "Attempt to find a class with the specified (incorrrect) name. 
  69.     Bernard Horan, 27 November 1992"
  70.  
  71.     | candidates smaller larger class |
  72.     candidates := OrderedCollection new.
  73.     smaller := aString size - 4.
  74.     larger := aString size + 4.
  75.     Smalltalk keysDo: [:k | 
  76.         (k size between: smaller and: larger)
  77.             ifTrue: 
  78.                 [| score |
  79.                 score := k spellAgainst: aString.
  80.                 score >= 50 ifTrue: [candidates add: k]]].
  81.     candidates isEmpty ifTrue: [^nil].
  82.     candidates := candidates asSortedCollection.
  83.     class := (PopUpMenu labelArray: candidates values: candidates) startUpWithHeading: 'Correct to...'.
  84.     ^class == 0 ifFalse:[class]! !
  85.  
  86.  
  87. !Browser class methodsFor: 'browsing'!
  88.  
  89. promptThenBrowseCalls
  90.     "Prompt the user for a selector or selector pattern.  If a selector,
  91.     then browse all calls on that selector.  If a pattern, then show a 
  92.     menu of selectors matching that pattern and browse the selected
  93.     one."
  94.     "Augmented to attempt to correct typing error.
  95.     Bernard Horan, 27 November 1992"
  96.     "Browser promptThenBrowseCalls"
  97.  
  98.     | trial symbol coll |
  99.     trial := DialogView 
  100.                 request: 'Browse calls on what?' 
  101.                 initialAnswer: ParagraphEditor currentSelection.
  102.     trial isEmpty ifTrue: [^self].
  103.     ((trial includes: $*) or: [trial includes: $#])
  104.         ifTrue:        "pattern"
  105.             [coll := OrderedCollection new.
  106.             Cursor wait showWhile:
  107.                 [Symbol allSubInstancesDo: 
  108.                     [:sym | (trial match: sym ignoreCase: false) ifTrue: [coll add: sym]]].
  109.             symbol := self showMenuThenBrowseCalls: coll]
  110.         ifFalse:    "single item"
  111.             [symbol := Symbol findInterned: trial.
  112. "Attempt to correct typing error"
  113.             symbol isNil ifTrue:[symbol := Symbol correctMessage: trial].
  114.             symbol isNil ifTrue: [DialogView warn: 'Nobody'. ^self].
  115.                     "it doesn't exist, therefore no senders"
  116.             ^self browseAllCallsOn: symbol]!
  117.  
  118. promptThenBrowseImplementors
  119.     "Prompt the user for a selector or selector pattern.  If a selector,
  120.     then browse all implementors of that selector.  If a pattern, then show a 
  121.     menu of selectors matching that pattern and browse the selected
  122.     one."
  123.     "Augmented to attempt to correct typing error.
  124.     Bernard Horan, 27 November 1992"
  125.     "Browser promptThenBrowseImplementors"
  126.  
  127.     | trial symbol coll |
  128.     trial := DialogView 
  129.                 request: 'Browse implementors of what?' 
  130.                 initialAnswer: ParagraphEditor currentSelection.
  131.     trial isEmpty ifTrue: [^self].
  132.     ((trial includes: $*) or: [trial includes: $#])
  133.         ifTrue:        "pattern"
  134.             [coll := OrderedCollection new.
  135.             Cursor wait showWhile:
  136.                 [self allImplementedMessages do: 
  137.                     [:sym | (trial match: sym ignoreCase: false) ifTrue: [coll add: sym]]].
  138.             symbol := self showMenuThenBrowse: coll]
  139.         ifFalse:    "single item"
  140.             [symbol := Symbol findInterned: trial.
  141. "Attempt to correct typing error"
  142.             symbol isNil ifTrue:[symbol := Symbol correctMessage: trial].
  143.             symbol isNil ifTrue: [DialogView warn: 'Nobody'. ^self].
  144.                 "it doesn't exist, therefore no implementors"
  145.             ^self browseAllImplementorsOf: symbol]! !
  146.  
  147.  
  148.